package com.lin.netty.module.byteBuf;

import com.lin.netty.utils.ByteBufUtils;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;

/**
 * ByteBuf切分方法，零拷贝（减少内存的复制次数）的体现之一
 * 对ByteBuf进行切分，但不是重新创建一个内存，将数据复制过去，用的还是原有ByteBuf的内存。
 * 切片后的 ByteBuf 维护独立的 read，write 指针
 *
 * slice切分后的ByteBuf有maxCapacity限制，不能再write数据
 */
public class ByteBufSliceTest {
    public static void main(String[] args) {
        ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(10);

        byteBuf.writeBytes(new byte[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'});
        ByteBufUtils.log(byteBuf);

        ByteBuf byteBuf1 = byteBuf.slice(0, 5);
        byteBuf1.retain();
        ByteBufUtils.log(byteBuf1);
        byteBuf1.setByte(0,'z');
        ByteBufUtils.log(byteBuf1);
        ByteBufUtils.log(byteBuf);
        byteBuf1.release();

        ByteBuf byteBuf2 = byteBuf.slice(5, 5);
        byteBuf2.retain();
        ByteBufUtils.log(byteBuf2);
        byteBuf2.release();

        byteBuf.release();
    }
}
